// //https://codeforces.com/gym/102822/problem/J
// //题意：给1e5个灯泡，每个灯泡在特定时间段亮起，有一个亮度，求一段时间内最亮的灯泡亮度
// //线段树区间修改+单点查询
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+50;
struct light
{
    int time;
    int x;
}lig[MAXN];
struct node
{
    int l,r;
    int max;
    int lazy;
}tr[MAXN<<2];
bool cmp(light a,light b){
    return a.x>b.x;
}
inline void pushup(int n){
    tr[n].max=max(tr[n<<1].max,tr[n<<1|1].max);
    return;
}
inline void pushdown(int n){
    if(tr[n].lazy){
        tr[n<<1].max=max(tr[n<<1].max,tr[n].lazy);
        tr[n<<1|1].max=max(tr[n<<1|1].max,tr[n].lazy);
        tr[n<<1].lazy=max(tr[n<<1].lazy,tr[n].lazy);
        tr[n<<1|1].lazy=max(tr[n<<1|1].lazy,tr[n].lazy);
        tr[n].lazy=0;
        
    }return;
}
void build(int n,int l,int r){
    tr[n].l=l,tr[n].r=r,tr[n].lazy=0;
    if(l==r){
        tr[n].max=0;
        return;
    }
    int mid=l+r>>1;
    build(n<<1,l,mid);
    build(n<<1|1,mid+1,r);
    pushup(n);
    return;
}
void change(int n,int l,int r,int k){
    if(tr[n].l>r||tr[n].r<l) return;
    if(tr[n].l>=l&&tr[n].r<=r){
        tr[n].max=max(tr[n].max,k);
        tr[n].lazy=max(tr[n].lazy,k);
        return;
    }
    pushdown(n);
    change(n<<1,l,r,k);
    change(n<<1|1,l,r,k);
    pushup(n);
    return;
}
int query(int n,int l,int r){
    if(tr[n].l>r||tr[n].r<l) return 0;
    if(tr[n].l>=l&&tr[n].r<=r){
        return tr[n].max;
    }
    pushdown(n);
    return max(query(n<<1,l,r),query(n<<1|1,l,r));
}
int main(){
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        int n,m;
        memset(tr,0,sizeof(tr));
        scanf("%d%d",&n,&m);
        for(int j=1;j<=n;j++){
            scanf("%d%d",&lig[j].time,&lig[j].x);
        }
        sort(lig+1,lig+n+1,cmp);
        build(1,1,m);
        int vis[MAXN]={0};
        for(int j=1;j<=n;j++){
            if(vis[lig[j].time]) continue;
            vis[lig[j].time]=1;
            int k=0;
            while(++k){
                int l=2*(k-1)*lig[j].time+1,r=2*(k-1)*lig[j].time+lig[j].time;
                if(l>m) break;
                change(1,l,r<m?r:m,lig[j].x);//注意边界防止越界
            }
        }
        printf("Case #%d:",i);
        for(int j=1;j<=m;j++){
            printf(" %d",query(1,j,j));
        }
        printf("\n");
    }
}
// #include<bits/stdc++.h>
// using namespace std;
// const int maxn=1e5+9;
// struct light{
// 	int time,x;
// }lig[maxn];
// struct tree{
// 	int l,r;
// 	int lazy;
// 	int max;
// }tr[maxn<<2];
// bool cmp(light a,light b){
// 	return a.x>b.x;
// }
// void solve(int rt,int val){
// 	tr[rt].max=max(tr[rt].max,val);
// 	tr[rt].lazy=max(tr[rt].lazy,val);
// } 
// inline void pushdown(int n){
//     if(tr[n].lazy){
//         tr[n<<1].max=max(tr[n<<1].max,tr[n].lazy);
//         tr[n<<1|1].max=max(tr[n<<1|1].max,tr[n].lazy);
//         tr[n<<1].lazy=max(tr[n<<1].lazy,tr[n].lazy);
//         tr[n<<1|1].lazy=max(tr[n<<1|1].lazy,tr[n].lazy);
//         tr[n].lazy=0;
        
//     }return;
// }
// void pushup(int rt){
// 	tr[rt].max=max(tr[rt<<1].max,tr[rt<<1|1].max);
// }
// void build(int rt,int l,int r){
// 	tr[rt].l=l;
// 	tr[rt].r=r;
// 	if(l==r){
// 		tr[rt].lazy=0;
// 		tr[rt].max=0;
// 		return ;
// 	}
// 	int mid=l+r>>1;
// 	build(rt<<1,l,mid);
// 	build(rt<<1|1,mid+1,r);
// 	pushup(rt);
// }
// void change(int rt,int l,int r,int k){
// 	if(tr[rt].l>r||tr[rt].r<l)return ;
// 	if(tr[rt].l>=l&&tr[rt].r<=r){
// 		solve(rt,k);
// 		return ;
// 	}
// 	if(tr[rt].lazy)pushdown(rt);
// 	change(rt<<1,l,r,k);
// 	change(rt<<1|1,l,r,k);
// 	pushup(rt);
// }
// int query(int rt,int l,int r){
// 	if(tr[rt].l>r||tr[rt].r<l)return 0;
// 	if(tr[rt].l>=l&&tr[rt].r<=r){
// 		return tr[rt].max;
// 	}
// 	pushdown(rt);
// 	return max(query(rt<<1,l,r),query(rt<<1|1,l,r));
// }
// int main(){
//     int t;
//     scanf("%d",&t);
//     for(int i=1;i<=t;i++){
// 		memset(tr,0,sizeof(tr));
//         int n,m;
//         scanf("%d%d",&n,&m);
//         for(int j=1;j<=n;j++){
//             scanf("%d%d",&lig[j].time,&lig[j].x);
//         }
//         sort(lig+1,lig+n+1,cmp);
//         build(1,1,m);
//         int vis[maxn]={0};
//         for(int j=1;j<=n;j++){
//             if(vis[lig[j].time]) continue;
//             vis[lig[j].time]=1;
//             int k=0;
//             while(++k){
//                 int l=2*(k-1)*lig[j].time+1,r=2*(k-1)*lig[j].time+lig[j].time;
//                 if(l>m) break;
//                 change(1,l,r<m?r:m,lig[j].x);//注意边界防止越界
//             }
//         }
//         printf("Case #%d:",i);
//         for(int j=1;j<=m;j++){
//             printf(" %d",query(1,j,j));
//         }
//         printf("\n");
//     }
// }
// #include<bits/stdc++.h>
// using namespace std;
// const int MAXN=1e5+50;
// struct light
// {
//     int t;
//     int x;
// }lig[MAXN];
// struct node
// {
//     int l,r;
//     int max;
//     int lazy;
// }tr[MAXN<<2];
// bool cmpl(light &a,light &b){
//     return a.x>b.x;
// }
// inline void pushup(int n){
//     tr[n].max=max(tr[n<<1].max,tr[n<<1|1].max);
//     return;
// }
// inline void pushdown(int n){
//     if(tr[n].lazy){
//         tr[n<<1].max=max(tr[n].max,tr[n<<1].lazy);
//         tr[n<<1|1].max=max(tr[n].max,tr[n<<1|1].lazy);
//         tr[n<<1].lazy=max(tr[n<<1].lazy,tr[n].lazy);
//         tr[n<<1|1].lazy=max(tr[n<<1|1].lazy,tr[n].lazy);
//         tr[n].lazy=0;
//     }
// }
// void build(int n,int l,int r){
//     tr[n].l=l,tr[n].r=r,tr[n].lazy=0;
//     if(l==r){
//         tr[n].max=0;
//         return;
//     }
//     int mid=l+r>>1;
//     build(n<<1,l,mid);
//     build(n<<1|1,mid+1,r);
//     pushup(n);
//     return;
// }
// void update(int n,int l,int r,int x){
//     if(tr[n].l>=l&&tr[n].r<=r){
//         tr[n].max=max(tr[n].max,x);
//         tr[n].lazy=max(tr[n].max,x);
//         return;
//     }
//     pushdown(n);
//     int mid=tr[n].l+tr[n].r>>1;
//     if(mid>=l) update(n<<1,l,r,x);
//     if(mid<r) update(n<<1|1,l,r,x);
//     pushup(n);
//     return;
// }
// int query(int n,int l,int r){
//     if(tr[n].l>r||tr[n].r<l) return 0;
//     if(tr[n].l>=l&&tr[n].r<=r){
//         return tr[n].max;
//     }
//     pushdown(n);
//     return max(query(n<<1,l,r),query(n<<1|1,l,r));
// }
// int main(){
//     int T;
//     scanf("%d",&T);
//     for(int i=1;i<=T;i++){
//         int n,m;
//         memset(tr,0,sizeof(tr));
//         scanf("%d%d",&n,&m);
//         for(int j=1;j<=n;j++){
//             scanf("%d%d",&lig[j].t,&lig[j].x);
//         }
//         sort(lig+1,lig+n+1,cmpl);
//         build(1,1,m);
//         int vis[MAXN]={0};
//         for(int j=1;j<=n;j++){
//             if(vis[lig[j].t]) continue;
//             vis[lig[j].t]=1;
//             int k=0;
//             while(++k){
//                 int l=2*(k-1)*lig[j].t+1,r=2*(k-1)*lig[j].t+lig[j].t;
//                 if(l>m) break;
//                 update(1,l,r<m?r:m,lig[j].x);//注意边界防止越界
//             }
//         }
//         printf("Case #%d:",i);
//         for(int j=1;j<=m;j++){
//             printf(" %d",query(1,j,j));
//         }
//         printf("\n");
//     }
// }